function main()
clc;
clear all;
% 文件行号
line_number = 0;
% 线程个数
thread_number = 0;
% 打开文件
fid = fopen('syn.dot');
% 读取数据存储在thread结构体中
% SerialID为线程序列号 ID为线程名称,Attribute为线程的基本信息,SynNumber为与该线程同步关系线程的个数
% SysIDs和SynWeights为与该线程同步关系的线程以及权重值
% Height 标识线程三维柱状图的高度
while 1
nextline = fgetl(fid); %read a line
if ~ischar(nextline)
break;
else
line_number = line_number + 1;
%disp(nextline);
[m,n]=size(nextline);
% 对特定行的lineData进行处理
if line_number > 1 && line_number < 11
thread_number = thread_number + 1;
v=find(nextline == '[');
w=find(nextline == '"');
thread(thread_number).SerialID = thread_number;
thread(thread_number).ID = char(nextline(2:v-1));
thread(thread_number).Attribute = nextline(w(1)+1:w(2)-1);
thread(thread_number).SynNumber = 0;
thread(thread_number).Height = 100;
end
if line_number > 10 && line_number < 27
h=find(nextline == '-');
v=find(nextline == '[');
l=find(nextline == ')');
w=find(nextline == '"');
ID = nextline(2:h(1)-2);
synID = nextline(h(2)+1:v-1);
synWeight = str2double(nextline(l+1:w(2)-1));
for i=1:thread_number
if(thread(i).ID == ID)
thread(i).SynNumber = thread(i).SynNumber + 1;
thread(i).SysIDs(thread(i).SynNumber) = str2double(synID);
thread(i).SynWeights(thread(i).SynNumber) = synWeight;
break;
end
end
for i=1:thread_number
if(thread(i).ID == synID)
thread(i).SynNumber = thread(i).SynNumber + 1;
thread(i).SysIDs(thread(i).SynNumber) = str2double(ID);
thread(i).SynWeights(thread(i).SynNumber) = synWeight;
break;
end
end
end
end
end
% 将主线程的高度变高
thread(9).Height = thread(9).Height * 1.8;
Z = rand(3, 3);
% 将各个线程按顺序 按列排 第一列 1 2 3 第二列 4 5 6
for i=1:3
for j=1:3
Z(j,i) = thread((i-1)*3+j).Height;
end
end
% global hfig
% hfig = figure;
hb = bar3(Z, 0.5, 'detached');
view(-52,62);
renderCDataByHeight(hb, true);
title('通信关系三维可视化');
xlabel('X'), ylabel('Y'), zlabel('Z')
% 输入你要查看的线程
stringINFO = ['请输入你要查看的线程编号','[', num2str(1), '-', num2str(thread_number), ']', ':'];
% threadID = input(stringINFO);
prompt = {stringINFO};
dlg_title = '消息';
num_lines = 1;
def = {'1'};
answer = inputdlg(prompt,dlg_title,num_lines,def);
threadID = str2num(answer{1});
x = fix((threadID+2)/3);
y = threadID - (x-1)*3;
% 显示该线程的基本信息
[m,n] = size(thread(threadID).Attribute);
h=find(thread(threadID).Attribute == '\');
thInfo = thread(threadID).Attribute;
x1 = thInfo(1:h(1)-1);
x2 = thInfo(h(1)+2:h(2)-1);
x3 = thInfo(h(2)+2:h(3)-1);
x4 = thInfo(h(3)+2:n);
text(x-0.3, y-0.3, thread(threadID).Height + 60, x1, 'color', 'k');
text(x-0.3, y-0.3, thread(threadID).Height + 40, x2, 'color', 'k');
text(x-0.3, y-0.3, thread(threadID).Height + 20, x3, 'color', 'k');
text(x-0.3, y-0.3, thread(threadID).Height + 0, x4, 'color', 'k');
[m,n] = size(thread(threadID).SysIDs);
% 权重越大,颜色越深
perColor = 0.5/n;
baseColor = 0.7;
for i=1:n
TempSysID = thread(threadID).SysIDs(i); % 逐个处理同步关系的线程
for j=1:thread_number
if(str2num(thread(j).ID) == TempSysID) % 通过ID号寻找线程序列编号
%计算该同步关系的线程是哪个?
x = fix((thread(j).SerialID+2)/3);
y = thread(j).SerialID - (x-1)*3;
% 显示与线程之间存在同步关系线程的权值
text(x, y, thread(j).Height, num2str(thread(threadID).SynWeights(i)), 'color', 'r');
xdata = get(hb(x), 'Xdata');
ydata = get(hb(x), 'Ydata');
zdata = get(hb(x), 'Zdata');
cdata = get(hb(x), 'Cdata');
baseColor = baseColor - perColor;
surface(xdata((y-1)*6+1:(y-1)*6+6,1:4), ydata((y-1)*6+1:(y-1)*6+6,1:4),...
zdata((y-1)*6+1:(y-1)*6+6,1:4), cdata((y-1)*6+1:(y-1)*6+6,1:4), 'FaceColor', [baseColor 0.2 0.7]);
break;
end
end
end
% xdata = get(hb(3), 'Xdata');
% ydata = get(hb(3), 'Ydata');
% zdata = get(hb(3), 'Zdata');
% cdata = get(hb(3), 'Cdata');
% surface(xdata(13:18,1:4), ydata(13:18,1:4), zdata(13:18,1:4), cdata(13:18,1:4), 'FaceColor', [0.4 1 1]);
% % 显示线程1基本信息
% text(1, 1, 100, thread(1).Attribute, 'color', 'b');
% % 显示线程1之间存在同步关系线程的权值
% text(1, 2, 100, num2str(thread(1).SynWeights(1)), 'color', 'r');
% text(1, 3, 100, num2str(thread(1).SynWeights(2)), 'color', 'r');
% text(2, 1, 100, num2str(thread(1).SynWeights(3)), 'color', 'r');
% text(2, 3, 100, num2str(thread(1).SynWeights(4)), 'color', 'r');
% text(3, 3, 180, num2str(thread(1).SynWeights(5)), 'color', 'r');
% 显示线程2基本信息
% text(1, 2, 100, thread(2).Attribute, 'color', 'b');
% 显示线程2之间存在同步关系线程的权值
% text(1, 1, 100, num2str(thread(2).SynWeights(1)), 'color', 'r');
% text(2, 1, 100, num2str(thread(2).SynWeights(2)), 'color', 'r');
% text(2, 3, 100, num2str(thread(2).SynWeights(3)), 'color', 'r');
% hold on;
% set(hb, 'ButtonDownFcn', @click_ceshi);
fclose(fid);
function click_ceshi(src, event)
global hfig
% 获取当前点坐标
xy = get(hfig, 'CurrentPoint');
% 获取gcf和gca的位置信息
hpos = get(hfig, 'Position');
apos = get(gca, 'Position');
% 更新点的信息,获取点针对于gca的准确坐标信息
x = (xy(1) - apos(1)*hpos(3))/(apos(3)*hpos(3));
y = (xy(2) - apos(2)*hpos(4))/(apos(4)*hpos(4));
xlim = get(gca, 'XLim');
ylim = get(gca, 'YLim');
x = x*(xlim(2) - xlim(1)) + xlim(1);
y = y*(ylim(2) - ylim(1)) + ylim(1);
% 标注
text(x, y, 'Happy', 'color', rand(3, 1));
function renderCDataByHeight(hb, interp)
% hb为bar3返回的三维柱状图句柄,
% 对hb的各柱子按高度渲染CData属性,
% interp指定是否渐变(默认为false)
% interp==true:每个柱子从下到上颜色渐变
% interp==false:每个柱子一种颜色
% hb中句柄个数等于数据列数,hb(j)为第j列数据的句柄
if nargin == 1
% interp默认值
interp=false;
end
if interp == true
%每个柱子从下到上颜色渐变
%shading interp;
for j = 1 : length(hb)
% 用Zdata属性去填充Cdata属性
zdata = get(hb(j), 'Zdata');
%set(hb(j), 'Cdata', zdata);
set(hb(j), 'FaceColor', [0.9 1 1]);
% 设置边线颜色
set(hb, 'EdgeColor', [0.5 0.5 0.5]);
end
% xdata = get(hb(3), 'Xdata');
% ydata = get(hb(3), 'Ydata');
% zdata = get(hb(3), 'Zdata');
% cdata = get(hb(3), 'Cdata');
% surface(xdata(13:18,1:4), ydata(13:18,1:4), zdata(13:18,1:4), cdata(13:18,1:4), 'FaceColor', [0.4 1 1]);
else
% 每个柱子一种颜色
for j = 1:length(hb)
% 设置hb(j)的Cdata属性
% 制作CData新值cdata用以替换其旧值
% cdata将在ZData的基础上修改而成
cdata = get(hb(j), 'ZData');
% cdata行数除以6就是数据行数
m = size(cdata,1)/6;
% 填充cdata
for i = 1:m
% 设置cdata中(i,j)数据对应的6行
% 将这6行的值均填充(i,j)数据的值
vij = cdata((i-1)*6+2,2);%可由cdata(ZData)中获得(i,j)数据的值
cdata((i-1)*6+1:(i-1)*6+6,:) = vij;%(i,j)数据对应的6行填充完毕
end
set(hb(j), 'Cdata', cdata);%将cdata赋给Cdata属性
end
end